var mysql = require('mysql')
var dbConfig = require('./config')
module.exports = {
  query: function (sql, params, callback) {
    // 每次使用的时候需要创建链接，数据操作完成之后要关闭连接
    var connection = mysql.createConnection(dbConfig.mysql)
    connection.connect(function (err) {
      // 连接错误，2秒重试
      if (err) {
        console.log('数据库链接失败:', err)
        setTimeout(this.query, 2000)
        return callback(err);
      }
      // results作为数据操作后的结果，fields作为数据库连接的一些字段，大家可以打印到控制台观察一下
      connection.on('error', function (err) {
        console.log('db error', err)
        // 如果是连接断开，自动重新连接
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {
          this.query()
        } else {
          return callback(err);
        }
      })
      // 开始数据操作
      connection.query(sql, params, function (err, results, fields) {
        if (err) {
          console.log('数据操作失败', err)
          return callback(err);
        }
        // 将查询出来的数据返回给回调函数，这个时候就没有必要使用错误前置的思想了，因为我们在这个文件中已经对错误进行了处理，如果数据检索报错，直接就会阻塞到这个文件中
        callback && callback(JSON.parse(JSON.stringify(results || {})), JSON.parse(JSON.stringify(fields || {})))
        // 停止链接数据库，必须再查询语句后，要不然一调用这个方法，就直接停止链接，数据操作就会失败
        connection.end(function (err) {
          if (err) {
            console.log('关闭数据库连接失败！', err)
            return callback(err);
          }
        })
      })
    })
  },
  jsonWrite: function (res, ret) {
    if (typeof ret === 'undefined') {
      res.json({
        code: 500,
        data: {},
        msg: ret.msg || '请求失败'
      })
    } else {
      res.json({
        code: ret.code || 0,
        data: ret.data || ret,
        msg: ret.msg || '请求成功'
      })
    }
  },
  /**
   * 判断必填
   * @param {json} json
   * @param {Array} params json的key字段
   */
  hasAllRequired: function (json, params) {
    let arr = params || []
    let paramsKey = ''
    // for (item in json)
    for (let i = 0; i < arr.length; i++) {
      if (!json[arr[i]] || json[arr[i]].length < 0) {
        paramsKey = arr[i]
        return { require: false, msg: '字段：' + paramsKey + '缺少' }
      } else {
        return { require: true }
      }
    }
  }

}
